﻿#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <fcntl.h>
#include <errno.h>
#include <termio.h>
#include <stdlib.h>
#include <termio.h>
#include "uart.h"


int openPort(QString com,int nSpeed, int nBits, int nStop, QString nEvent)  //打开串口程序
{
    int fd = -1;
    QByteArray bada;
    char *cm;
    bada= com.toLatin1();
    cm = bada.data();  //打开端口
    fd = open(cm, O_RDWR|O_NOCTTY);
    if (fd < 0) {
          return -1;
    }
    struct termios newtio,oldtio;
            if  ( tcgetattr( fd,&oldtio)  !=  0) {
                    perror("SetupSerial 1");
                    return -1;
            }
            bzero( &newtio, sizeof( newtio ) );
            newtio.c_cflag  |=  CLOCAL | CREAD;
            newtio.c_cflag &= ~CSIZE;

            switch( nBits )
            {
            case 7:
                    newtio.c_cflag |= CS7;
                    break;
            case 8:
                    newtio.c_cflag |= CS8;
                    break;
            }

            if(nEvent == "O")
            {
                newtio.c_cflag |= PARENB;
                newtio.c_cflag |= PARODD;
                newtio.c_iflag |= (INPCK | ISTRIP);

            }
            else if(nEvent == "E")
            {
                newtio.c_iflag |= (INPCK | ISTRIP);
                newtio.c_cflag |= PARENB;
                newtio.c_cflag &= ~PARODD;

            }
            else if(nEvent == "N")
            {
                newtio.c_cflag &= ~PARENB;

            }
            switch( nSpeed )
            {
            case 600:
                    cfsetispeed(&newtio, B600);
                    cfsetospeed(&newtio, B600);
                    break;
            case 1200:
                    cfsetispeed(&newtio, B1200);
                    cfsetospeed(&newtio, B1200);
                    break;
            case 2400:
                    cfsetispeed(&newtio, B2400);
                    cfsetospeed(&newtio, B2400);
                    break;
            case 4800:
                    cfsetispeed(&newtio, B4800);
                    cfsetospeed(&newtio, B4800);
                    break;
            case 9600:
                    cfsetispeed(&newtio, B9600);
                    cfsetospeed(&newtio, B9600);
                    break;
            case 19200:
                    cfsetispeed(&newtio, B19200);
                    cfsetospeed(&newtio, B19200);
                    break;
            case 38400:
                    cfsetispeed(&newtio, B38400);
                    cfsetospeed(&newtio, B38400);
                    break;
            case 115200:
                    cfsetispeed(&newtio, B115200);
                    cfsetospeed(&newtio, B115200);
                    break;
            case 460800:
                    cfsetispeed(&newtio, B460800);
                    cfsetospeed(&newtio, B460800);
                    break;
            default:
                    cfsetispeed(&newtio, B9600);
                    cfsetospeed(&newtio, B9600);
                    break;
            }
            if( nStop == 1 )
                    newtio.c_cflag &=  ~CSTOPB;
            else if ( nStop == 2 )
            newtio.c_cflag |=  CSTOPB;
            newtio.c_cc[VTIME]  = 0;
            newtio.c_cc[VMIN] = 0;
            tcflush(fd,TCIFLUSH);
            if((tcsetattr(fd,TCSANOW,&newtio))!=0)
            {
                    perror("com set error");
                    return -1;
            }
   return fd;
}
